// 导入NestFactory，用于创建Nest应用实例
import { NestFactory } from '@nestjs/core';
// 导入应用的根模块
import { AppModule } from './app.module';
// 导入ValidationPipe，用于请求数据验证
import { ValidationPipe } from '@nestjs/common';
// 导入NestExpressApplication接口，指定应用类型为Express
import { NestExpressApplication } from '@nestjs/platform-express';
// 导入path模块的join方法，用于处理文件路径
import { join } from 'path';
// 导入ConfigService，用于访问环境配置
import { ConfigService } from '@nestjs/config';
import * as bodyParser from 'body-parser';

// 定义启动应用的异步函数
async function bootstrap() {
  // 创建NestJS应用实例，指定为Express应用，增加JSON和URL编码大小限制
  const app = await NestFactory.create<NestExpressApplication>(AppModule, {
    bodyParser: true,
  });

  // 获取配置服务实例
  const configService = app.get(ConfigService);

  // 获取最大文件大小配置，默认为1GB
  const maxFileSize = parseInt(process.env.FILE_MAX_SIZE); // 1GB

  // 设置服务端超时时间为1分钟
  const httpServer = app.getHttpServer();
  httpServer.setTimeout(parseInt(process.env.TIIMEOUT)); // 1分钟

  // 配置Express应用的请求超时
  app.use((req, res, next) => {
    // 设置请求超时为1分钟
    req.setTimeout(parseInt(process.env.TIIMEOUT));
    next();
  });

  // 增加Express的请求体解析器限制
  app.use(bodyParser.json({ limit: maxFileSize }));
  app.use(bodyParser.urlencoded({ extended: true, limit: maxFileSize }));
  app.use(bodyParser.raw({ limit: maxFileSize }));

  // 全局使用ValidationPipe进行请求参数验证
  app.useGlobalPipes(new ValidationPipe());
  // 启用CORS跨域支持
  app.enableCors();

  // 配置静态资源目录，用于提供HTML、CSS、JS等静态文件
  app.useStaticAssets(join(__dirname, '..', 'src', 'public'));

  // 从配置中获取端口号，默认为3000
  const port = configService.get<number>('PORT', 3000);
  // 启动应用并监听指定端口
  await app.listen(port);
  // 打印应用运行URL和上传大小限制
  console.log(`Application is running on: ${await app.getUrl()}`);
  console.log(`Max file upload size: ${Math.round(maxFileSize / (1024 * 1024))}MB`);
}
// 调用启动函数
bootstrap();
